package storage

import (
	"context"
	"errors"
	"fmt"
	"io"
	"time"
)

// Manager 存储管理器
type Manager struct {
	storage Storage
}

// NewManager 创建存储管理器
func NewManager(storage Storage) (*Manager, error) {
	if storage == nil {
		return nil, errors.New("存储实现不能为空")
	}

	return &Manager{
		storage: storage,
	}, nil
}

// Upload 上传文件
func (m *Manager) Upload(ctx context.Context, name string, reader io.Reader, option *UploadOption) (*FileInfo, error) {
	return m.storage.Upload(ctx, name, reader, option)
}

// Delete 删除文件
func (m *Manager) Delete(ctx context.Context, path string) error {
	return m.storage.Delete(ctx, path)
}

// GetURL 获取文件访问URL
func (m *Manager) GetURL(ctx context.Context, path string, expiration time.Duration) (string, error) {
	return m.storage.GetURL(ctx, path, expiration)
}

// GetFileInfo 获取文件信息
func (m *Manager) GetFileInfo(ctx context.Context, path string) (*FileInfo, error) {
	return m.storage.GetFileInfo(ctx, path)
}

// ListFiles 列出指定目录下的文件
func (m *Manager) ListFiles(ctx context.Context, prefix string) ([]*FileInfo, error) {
	return m.storage.ListFiles(ctx, prefix)
}

// GetStorageType 获取存储类型
func (m *Manager) GetStorageType() StorageType {
	return m.storage.Type()
}

// CreateStorage 根据配置创建存储实例
func CreateStorage(config StorageConfig) (Storage, error) {
	if config == nil {
		return nil, errors.New("存储配置不能为空")
	}

	switch config.GetStorageType() {
	case StorageTypeLocal:
		localConfig, ok := config.(*LocalConfig)
		if !ok {
			return nil, errors.New("无效的本地存储配置")
		}
		return NewLocalStorage(localConfig)
	case StorageTypeOSS:
		ossConfig, ok := config.(*OSSConfig)
		if !ok {
			return nil, errors.New("无效的OSS存储配置")
		}
		return NewOSSStorage(ossConfig)
	default:
		return nil, fmt.Errorf("不支持的存储类型: %s", config.GetStorageType())
	}
}
